home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / embedded / mcu / float09.arc / RNDEXEP.SA < prev    next >
Text File  |  1987-03-04  |  10KB  |  534 lines

  1.  NAM  EXEPRND
  2.  TTL  ROUND AND OVERFLOW/UNDERFLOW ROUTINES
  3. *
  4. * LINKING LOADER ROUTINES
  5. *
  6.   XDEF    ROUND,ADBIAS,SUBIAS,CHKOVF,CHKUNF
  7. *
  8.   XREF    MINTBL,MAXTBL,CLRES,DNMTBL
  9. *
  10. * REVISION HISTORY:
  11. *   DATE    PROGRAMMER     REASON
  12. *
  13. *  23.MAY.80    G. STEVENS     ORIGINAL
  14. *  22.JUL.80    G. STEVENS     FIX UNDERFLOW FOR ZEROEX
  15. *  30.JUL.80    G. WALKER      REALLY FIX UNDERFLOW
  16. *  03.AUG.80    G. STEVENS     ROUND ZEROS BEYOND RPREC
  17. *  21.AUG.80    G. STEVENS     SET UNF AND OVF FLAGS IN CHKUNF
  18. *                   AND CHKOVF
  19. *  21.AUG.80    G. STEVENS     SET INEXACT IF ROUNDING NEEDED
  20. *  22.AUG.80    G. STEVENS     CHANGE CONDITIONALS IN CHKUNF&CHKOVF
  21. *  25.AUG.80    G. STEVENS     CHANGE EXP. TABLE & CONDITIONAL IN CHKOVF
  22. *
  23.  PAGE
  24. *
  25. ******************************************************************
  26. *
  27. *  SUBROUTINE ROUND
  28. *
  29. *   ROUND HANDLES THE ROUNDING OPERATIONS
  30. * ON THE FLP RESULT. THE TYPE OF ROUNDING
  31. * SUPPORTED INCLUDE:
  32. *
  33. *   RM - ROUND TO MINUS INFINITY
  34. *   RN - ROUND TO PLUS INFINITY
  35. *   RN - ROUND TO NEAREST
  36. *   RZ - ROUND TO ZERO
  37. *
  38. *   THIS ROUTINE SUPPORTS ALL PRECISION
  39. * FORMATS I.E. SINGLE, DOUBLE, EXTENDED
  40. * AND EXTENDED WITH FORCED ROUNDING.
  41. *
  42. *
  43. *BEGIN
  44. *
  45. * DECIDE PRECISION MODE
  46. *
  47. ROUND EQU  *
  48. *
  49.  LDB  RPREC,U
  50. *
  51. * FIX UP THE STIKY BYTE
  52. *
  53.  LSRB          HALF THE RETURNED PRECISION INDEX
  54.  LEAY  SFIX,PCR       MASK TABLE FOR ROUND BITS
  55.  LDA  B,Y      GET THE ROUND BIT MASK
  56.  PSHS  A      SAVE IT
  57. *
  58. * NOW FIND THE G-BIT OF THE FRACTION
  59. *
  60.  LSLB
  61.  LSLB          QUADRUPLE PRECISION INDEX
  62. *
  63. * POINT Y TO CORRECT POSITION IN THE OFFSET TABLE
  64. *
  65.  LEAY  SINGLE,PCR
  66.  LEAY  B,Y
  67. *
  68. *
  69.  LDB  0,Y         OFFSET TO G-BYTE
  70.  LDA  B,X         GET G-BYTE
  71. *
  72. * PROCEED TO CORRECT THE STKIY BYTE BY ORING IN
  73. * THE ROUND BITS IN THE FRACTION WITH THE STIKY
  74. * BYTE.
  75. *
  76.  ANDA  0,S  CORRECT MASK IS ON THE STACK
  77.  ORA  STIKY,U
  78.  STA  STIKY,U
  79.  LEAS  1,S     CLEAN UP THE STACK
  80. *
  81. * NOW THAT THE PRECISION IS KNOWN AND THE STIKY
  82. * BYTE HAS BEEN CORRECTED DECIDE IF ROUNDING IS
  83. * NEEDED.
  84. *
  85.  LDA  B,X    GET G-BYTE
  86.  ANDA  1,Y    GET G-BIT
  87.  ORA  STIKY,U    OR IN STIKY BYTE
  88. *
  89. *  IF ROUNDING IS NEEDED THEN CASE( ROUNDING MODE)
  90. * TO DETERMINE DESIRED ROUNDING OERATIONS.
  91. *
  92.  IFCC  NE
  93.    LDA    TSTAT,U     SET INEXACT RESULT
  94.    ORA    #ERRINX
  95.    STA    TSTAT,U
  96. *
  97.    LDA    [PFPCB,U]   GET CONTROL WORD
  98.    ANDA  #CTLRND    ISOLATE ROUNDING INFO
  99. *
  100. * CASE OF ROUND TO MINUS INFINITY
  101. *
  102.    IF  A,EQ,#RM
  103. *
  104. * IF SIGN IS NEG., ADD 1 TO L
  105. *
  106.      LDA  SIGN,X
  107.      IFCC  LT
  108. *
  109. * GET OFFSET TO L BYTE(REG. B) AND THE ONE TO
  110. * CONSTANT(REG. A).
  111. *
  112.        LDD  2,Y
  113. *
  114. *
  115. * PERFORM A MULTIPRECISION 1 TO L ADD
  116. *
  117.        BSR  MPADD
  118. *
  119.      ENDIF
  120. *
  121. * CASE OF ROUND TO PLUS INFINITY:
  122. *
  123.    ELSE
  124.    IF  A,EQ,#RP
  125. *
  126. * IF SIGN IS POS., ADD 1 TO L
  127. *
  128.      LDA  SIGN,X
  129.      IFCC  GE
  130. *
  131. * GET OFFSET TO L BYTE(REG. B) AND THE ONE TO
  132. * CONSTANT(REG. A).
  133. *
  134.        LDD  2,Y
  135. *
  136. *
  137. * PERFORM A MULTIPRECISION 1 TO L ADD
  138. *
  139.        BSR  MPADD
  140. *
  141.      ENDIF
  142. *
  143. * CASE OF ROUND TO NEAREST:
  144. *
  145.    ELSE
  146.    IF  A,EQ,#RN
  147. *
  148. * IF G = 1 AND(R = S = 1 OR L = 1)THEN
  149. * ADD 1 TO G
  150. *
  151.      LDB  0,Y          GET OFFSET TO G BYTE
  152.      LDA  B,X          LOOK AT G BYTE
  153.      ANDA  1,Y          LOOK AT G BIT
  154.      IFCC NE
  155.        LDA  STIKY,U    LOOK AT STIKY BYTE
  156.        IFCC  EQ     R & S <> 0
  157.      LDB  2,Y    GET OFFSET TO L BYTE
  158.      LDA  B,X    LOOK AT L BIT
  159.      ANDA  3,Y    CHECK L BIT
  160.      IFCC  EQ    L BIT <> 0
  161.        BRA    NORND    EXIT ROUND PROCESS
  162. *
  163.      ENDIF
  164.        ENDIF
  165. *
  166. * IF G( RS + L ) = 1  THEN ADD ONE THE G - BIT
  167. *
  168. * GET OFFSET TO G BYTE( REG. A ) AND THE ONE TO
  169. * G CONSTANT( REG. B ).
  170. *
  171.        LDD  0,Y
  172. *
  173. * PERFORM A MULTI PRECISION ONE TO G ADD
  174. *
  175.        BSR  MPADD
  176. *
  177. NORND EQU  *
  178. *
  179.      ENDIF             G - BIT SET
  180.    ENDIF             CASE OF RN
  181.    ENDIF             CASE OF RP
  182.    ENDIF             CASE OF RP
  183. *
  184. * FLUSH OUT STACK FRAME ARGUMENT BEYOND ITS PRECISION
  185. *
  186.    LDB    RPREC,U          PRECISION INDEX
  187.    LBSR  CLRES             ZERO OUT PROCEDURE
  188. *
  189. * END OF CASE( ROUNDING MODE )
  190. *
  191. *
  192. *
  193. *
  194.  ENDIF          ROUNDING NEEDED
  195. *
  196. *
  197.  RTS  RETURN
  198. *
  199. *
  200. * HERE IS A TABLE CONTAINING THE BYTE AND
  201. * BIT LOCATIONS OF THE L AND G-BITS FOR
  202. * THE VARIOUS PRECISION MODES. SUBROUTINE
  203. * ROUND OPERATES AS A TABLE INTERPERTER
  204. * USING THIS TABLE.
  205. *
  206. SINGLE FCB  FRACT+3   BYTE OFFSET TO G
  207.  FCB  BIT7   BIT LOCATION OF G
  208.  FCB  FRACT+2       BYTE OFFSET TO L
  209.  FCB  BIT0   BIT LOCATION OF L
  210. *
  211. DOUBLE FCB   FRACT+6  BYTE OFFSET TO G
  212.  FCB  BIT2   BIT LOCATION OF G
  213.  FCB  FRACT+6       BYTE OFFSET TO L
  214.  FCB  BIT3   BIT LOCATION OF L
  215. *
  216. EXTND FCB  FRACT+8    BYTE OFFSET TO G
  217.  FCB  BIT7   BIT LOCATION OF G
  218.  FCB  FRACT+7       BYTE OFFSET TO L
  219.  FCB  BIT0   BIT LOCATION OF L
  220. *
  221. EXTFTS FCB  FRACT+3   BYTE OFFSET TO G
  222.  FCB  BIT7   BIT LOCATION OF G
  223.  FCB  FRACT+2       BYTE OFFSET TO L
  224.  FCB  BIT0   BIT LOCATION OF L
  225. *
  226. EXTFTD FCB  FRACT+6  BYTE OFFSET TO G
  227.  FCB  BIT2   BIT LOCATION OF G
  228.  FCB  FRACT+6       BYTE OFFSET TO L
  229.  FCB  BIT3   BIT LOCATION OF L
  230. *
  231. * HERE IS THE TABLE OF GET ROUND BIT MASKS
  232. *
  233. SFIX FCB  $7F           SINGLE
  234.      FCB  BIT0+BIT1    DOUBLE
  235.      FCB  $7F           EXTENDED
  236.      FCB  $7F           EXT. FORCE TO SINGLE
  237.      FCB  BIT0+BIT1    EXT. FORCE TO DOUBLE
  238. *
  239. *
  240.  PAG
  241. ******************************************************************
  242. *
  243. * SUBROUTINE  MPADD
  244. *
  245. *    MPADD PERFORMS A MULTI-PRECISION ADDITION
  246. * OF AN 8-BIT OPERAND WITH THE SIGNIFICAND
  247. * OF A FLOATING OPERAND. THE 8-BIT QUANTITY
  248. * IS ADDED TO THE LSBYTE OF THE SIGNIFICAND
  249. * WHICH IS SPECIFIED BY AN OFFSET PASSED IN
  250. * IN THE B-REG. OVERFLOW CHECKING IS PROVIDED
  251. * ASSUMING UNSIGNED OPERANDS. IF OVERFLOW DOES
  252. * OCCUR THEN THE SIGNIFICAND IS RIGHT SHIFTED
  253. * ONCE AND THE EXPONENT IS INCREMENTED.
  254. *
  255. *ON ENTRY:
  256. *
  257. *   B - CONTAINS THE 8-BIT OPERAND
  258. *
  259. *   X - POINTS TO THE ARGUMENT ON THE STACK FRAME
  260. *
  261. *   A - CONTAINS AN OFFSET TO THE LSBYTE OF THE
  262. *    MULTI-PRECISION OPERAND.
  263. *
  264. *
  265. *BEGIN
  266. *
  267. * ADD 8-BIT OPERAND TO LSBYTE OF OP2.
  268. *
  269. MPADD ADDB   A,X
  270.  STB  A,X
  271.  ANDB  #00  CLEAR B, SAVE CCR
  272. *
  273. * PROPAGATE CARRY TO HIGHER ORDER BYTES
  274. * OF MULTIPRECISION OPERAND.
  275. *
  276.  ROLB        SAVE CARRY IN A
  277.  DECA
  278.  WHILE    A,GE,#FRACT
  279.    IFTST  B,NE,0
  280.      ADDB  A,X     ADD IN CARRY
  281.      STB  A,X
  282.      ANDB  #00     CLEAR A
  283.      ROL B     SAVE CARRY IN B
  284.      DECA
  285. *
  286.    ELSE
  287.      LDA  #FRACT-1   TERMINATE WHILE LOOP
  288.    ENDIF
  289.  ENDWH
  290. *
  291. *
  292. *
  293. * CHECK FOR OVERFLOW; IF SO THEN RIGHT SHIFT
  294. * FRACTION AND INCREMENT EXPONENT.
  295. *
  296.  IFTST    B,NE,O
  297.    LDA    #FRACT
  298.    WHILE  A,LT,(0,Y)
  299.      RORB       MOVE CARRY TO CC
  300.      ROR  A,X
  301.      ROLB       SAVE CARRY IN B
  302.      INCA
  303.    ENDWH
  304. *
  305. *
  306.    LDD    EXP,X
  307.    INCD
  308.    STD    EXP,X
  309. *
  310.  ENDIF
  311. *
  312.  RTS    RETURN
  313. *
  314. *
  315. *
  316. *
  317.  PAG
  318. *****************************************************************
  319. *
  320. * SUBROUTINE ADBIAS
  321. *
  322. *   ADBIAS ADDS IN THE BIAS TO THE EXPONENT
  323. * OF RESULT ON OVERFLOW. THE BIAS' ARE:
  324. *
  325. *      SINGLE = 192
  326. *      DOUBLE = 1536
  327. *    EXTENDED = 24576
  328. *
  329. *   ENTRY REQUIREMENTS:
  330. *
  331. *    U - CONTAINS POINTER TO STACK FRAME
  332. *
  333. *   ON EXIT:
  334. *
  335. *    A,B,X,- DESTROYED
  336. *
  337. *
  338. * DETERMINE PRECISION MODE
  339. *
  340. ADBIAS EQU  *
  341. *
  342.  PSHS  X,D         SAVE CALLERS REGS.
  343. *
  344.  LDB  RPREC,U
  345. *
  346. * GET BIAS FOR THE GIVEN PRECISION
  347. *
  348.  LEAX  BITBL,PCR
  349.  ABX
  350. *
  351. * ADD BIAS TO EXPONENT
  352. *
  353.  LDD  EXPR,U
  354.  ADDD  0,X
  355.  STD  EXPR,U
  356. *
  357.  PULS  X,D,PC        RESTORE AND RETURN
  358. *
  359. *
  360.  PAG
  361. ******************************************************************
  362. *
  363. * SUBROUTINE  SUBIAS
  364. *
  365. *    SUBIAS SUBTRACTS THE BIAS FROM THE EXPONENT
  366. * OF RESULT ON OVERFLOW. THE BIAS' ARE:
  367. *
  368. *       SINGLE = 192
  369. *       DOUBLE = 1536
  370. *     EXTENDED = 24576
  371. *
  372. * ENTRY REQUIREMENTS:
  373. *
  374. *    U - CONTAINS POINTER TO STACK FRAME
  375. *
  376. * ON EXIT:
  377. *
  378. *    A,B,X - DESTROYED
  379. *
  380. *
  381. * DETERMINE PRECISION MODE
  382. *
  383. SUBIAS EQU  *
  384. *
  385.  PSHS  X,D           SAVE CALLERS REGS.
  386. *
  387.  LDB  RPREC,U
  388. *
  389. * GET BIAS FOR GIVEN PRECISION MODE
  390. *
  391.  LEAX  BITBL,PCR
  392.  ABX
  393. *
  394. * SUBTRATCT BIAS FROM EXPONENT RESULT
  395. *
  396.  LDD  EXPR,U
  397.  SUBD  0,X
  398.  STD  EXPR,U
  399. *
  400.  PULS  X,D,PC         RESTORE AND RETURN
  401. *
  402. *
  403. * HERE IS A TABLE OF UNDERFLOW/OVERFLOW
  404. * ADJUST BIASES.
  405. *
  406. BITBL FDB 192  SINGLE
  407.       FDB 1536    DOUBLE
  408.       FDB 24576  EXTENDED
  409.       FDB 192  EXT. FORCE TO SINGLE
  410.       FDB 1536    EXT. FORCE TO DOUBLE
  411. *
  412.  PAG
  413. *
  414. *
  415. *******************************************************************
  416. *
  417. * SUBROUTINE  CHKOVF
  418. *
  419. *   OVERFL TESTS A ROUNDED RESULT FOR AN
  420. * OVERFLOW CONDITION. IF THE ROUNDED RESULT IS
  421. * FINITE AND ITS EXPONENT IS TO LARGE FOR THE
  422. * DESTINATION THEN OVERFLOW := TRUE; OTHERWISE
  423. * OVERFLOW := FALSE.
  424. *
  425. * ENTRY REQUIREMENTS:
  426. *
  427. *  U - CONTAINS POINTER TO THE STACK FRAME
  428. *
  429. * EXIT REQUIREMENTS:
  430. *
  431. *  CC - Z BIT SET IF TRUE
  432. *    Z BIT CLAERED IF FALSE
  433. *
  434. *   A,B,X - DESTROYED
  435. *
  436. *
  437. * SEE IF EXPONENT IS FINITE
  438. *
  439. CHKOVF    EQU  *
  440.  LDD   EXPR,U    LOOK AT EXPONENT
  441.  IF  D,NE,#INFEX
  442. *
  443. * GET PRECISION MODE
  444. *
  445.  LDB  RPREC,U
  446. *
  447. * COMPARE EXPONENT RESULT TO MAX UNBIASED
  448. * EXPONENT
  449. *
  450.    LEAX  MAXTBL,PCR   MAX EXPONENT TABLE
  451.    ABX
  452.    LDD    EXPR,U
  453.    IF  D,GE,(0,X)
  454.      LDA  TSTAT,U     SET OVEFLOW FLAG
  455.      ORA  #ERROVF
  456.      STA  TSTAT,U
  457. *
  458.      ORCC  #Z      OVERFLOW := TRUE
  459. *
  460.    ELSE
  461.      ANDCC  #NZ   OVERFLOW := FALSE
  462. *
  463.    ENDIF
  464. *
  465. * IF EXPONENT WAS NOT FINITE TO BEGIN
  466. * WITH RETURN OVERFLOW := FALSE
  467. *
  468.  ELSE
  469.    ANDCC  #NZ      OVERFLOW := FALSE
  470. *
  471.  ENDIF
  472. *
  473.  RTS           RETURN
  474. *
  475. *
  476.  PAG
  477. *******************************************************************
  478. *
  479. *  SUBROUTINE  CHKUNF
  480. *
  481. *    UNDRFL TESTS A ROUNDED RESULT FOR AN
  482. * OVERFLOW CONDITION. IF THE RESULTS
  483. * EXPONENT IS TOO SMALL FOR THE DESTINATION
  484. * THEN UNDERFLOW := TRUE; OTHERWISE
  485. * OVERFLOW := FALSE.
  486. *
  487. * ENTRY REQUIREMENTS:
  488. *
  489. *    U - CONTAINS POINTER TO THE STACK FRAME
  490. *
  491. * ON EXIT:
  492. *
  493. *    CC - Z BIT SET IF TRUE
  494. *      Z BIT CLEARED IF FALSE
  495. *
  496. *    A,B,X - DESTROYED
  497. *
  498. *
  499. *
  500. * DETERMINE PRECISION MODE
  501. *
  502. CHKUNF    EQU  *
  503. *
  504.  LDB  RPREC,U
  505.  LEAX  DNMTBL,PCR    MIN. EXPONENT TABLE
  506.  ABX
  507. *
  508. * IF EXPONENT NOT THAT OF A NORMAL ZERO THEN
  509. * COMPARE EXPONENT RESULT TO MINIMUM UNBIASED
  510. * EXPONENT.
  511. *
  512.  LDD  EXPR,U        EXPONENT OF RESULT
  513.  IF  D,NE,#ZEROEX    CHECK AGAINST INTERNAL MIN.
  514.    IF  D,LT,(0,X)
  515.      LDA  TSTAT,U    SET UNDERFLOW FLAG BYTE
  516.      ORA  #ERRUNF
  517.      STA  TSTAT,U
  518. *
  519.      ORCC  #Z          UNDERFLOW := TRUE
  520. *
  521.    ELSE
  522.      ANDCC  #NZ       UNDERFLOW := FALSE
  523. *
  524.    ENDIF
  525. *
  526.  ELSE
  527.    ANDCC  #NZ          UNDERFLOW := FALSE
  528. *
  529.  ENDIF
  530. *
  531.  RTS           RETURN
  532. *
  533. *
  534.